package utils;

import comun.MyException;
import persistencia.Persistencia;
import persistencia.dominio.*;
import server.aula.ControlAula;
import java.util.Iterator;
import java.util.Vector;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: </p>
 * @author unascribed
 * @version 1.0
 */

public class CambiosPermisosUsuarios {
	
	protected static Persistencia persistencia  = new Persistencia();
	protected static ControlAula controlAula = null;
	

  public CambiosPermisosUsuarios() {
	  
  }
      
  public static String agregandoUsuariosDeAyV(){
	  try {
		  persistencia.crearTransaccion();
		  actualizarPermisosYCrearUsuarios(); 
		  commit();
	  } catch (Exception e) {
		  // TODO Auto-generated catch block
		  e.printStackTrace();
		  rollback();
		  return "ERROR...";
	  }
	  return "OK, no se originaron problemas";
  }  

  public static Curso getAulaDelLosPermisos(Long idCurso) throws Exception{//new Long(3166749844)
	    try{
	   	  Curso administracionRural_cod3101 = (Curso)persistencia.getObjectoPorId("persistencia.dominio.Aula",idCurso);
	      return administracionRural_cod3101;
	    }catch (Exception ex) {
	      ex.printStackTrace();
	      throw ex;
	    }
  }
  
  public static Vector getCursosDeUnaFacultad(Long idFacultad) throws Exception{
	  try{
		  Vector cursosDeLaFacultad = persistencia.getObjectosPorClaseYFiltro
		  									("persistencia.dominio.Curso","aulaCompuesta.id=="+idFacultad);
		 
		  return cursosDeLaFacultad;
	  }catch (Exception ex) {
		  ex.printStackTrace();
		  throw ex;
	  }
  }
  
  public static Participante getParticipante(Long idPersona, Long idAula, Long idTipoUsuario) throws Exception{
	  try{
		  Vector participantesSoloUnoONinguno = persistencia.getObjectosPorClaseYFiltro
		  									("persistencia.dominio.Participante","tipoUsuario.id=="+idTipoUsuario+" & "+
		  																		 "aula.id=="+idAula+
		  																		 " & persona.id=="+idPersona);
		 
		  if(participantesSoloUnoONinguno==null || participantesSoloUnoONinguno.isEmpty())return null;
		  else return (Participante)participantesSoloUnoONinguno.elementAt(0);
	  }catch (Exception ex) {
		  ex.printStackTrace();
		  throw ex;
	  }
  }

  public static ParticipanteComision getParticipanteComision(Long idPersona, Long idAula, Long idTipoUsuario) throws Exception{
	  try{
		  Vector participantesSoloUnoONinguno = persistencia.getObjectosPorClaseYFiltro
		  									("persistencia.dominio.ParticipanteComision","participante.tipoUsuario.id=="+idTipoUsuario+" & "+
		  																		 "comision.id=="+idAula+
		  																		 " & participante.persona.id=="+idPersona);
		 
		  if(participantesSoloUnoONinguno==null || participantesSoloUnoONinguno.isEmpty())return null;
		  else return (ParticipanteComision)participantesSoloUnoONinguno.elementAt(0);
	  }catch (Exception ex) {
		  ex.printStackTrace();
		  throw ex;
	  }
  }
  
  
  private static void actualizarPermisosYCrearUsuarios()throws Exception{
	  	try {
	  		controlAula = new ControlAula(persistencia);
			
			//Long idCoordinador = new Long("107950774");
			Long idInvitado = new Long("3278408");
			//Long idWebMaster = new Long("131079");
			
			//TipoUsuario coordina = (TipoUsuario)persistencia.getObjectoPorId("persistencia.dominio.TipoUsuario",idCoordinador);
			TipoUsuario invita = (TipoUsuario)persistencia.getObjectoPorId("persistencia.dominio.TipoUsuario",idInvitado);
						
			//Persona coordinador = (Persona)persistencia.getObjectoPorId("persistencia.dominio.Persona",new Long("1573332143"));
			Persona invitado = (Persona)persistencia.getObjectoPorId("persistencia.dominio.Persona",new Long("643188419"));
			
			Vector aulas = getCursosDeUnaFacultad(new Long("35052426"));//35052426 aula de la facultad
			
			//ParticipanteComision participanteComisionCoordina = null;
			ParticipanteComision participanteComisionInvita = null;
			Vector participantesExistente = null;
			for(Iterator iterator = aulas.iterator(); iterator.hasNext();){
				Curso cursoActual = (Curso) iterator.next();
				
				// crear los participantes -----------------------------------------------------------
				//Coordinador
				participantesExistente = null;
				//Participante participanteCoordina = null;
				/*if(true){
					participanteCoordina = getParticipante(coordinador.getId(),cursoActual.getId(),coordina.getId());
					if(participanteCoordina==null){
						participanteCoordina = new Participante();
						persistencia.hacerPersistente(participanteCoordina);
						participanteCoordina.setTipoUsuario(coordina);
						participanteCoordina.setEstadoParticipante(null);
						participanteCoordina.setAula(cursoActual);
						participanteCoordina.setPersona(coordinador);
					}			
				}*/
				
				//Invitado
				Participante participanteInvita = null;
				if(true){
					participanteInvita = getParticipante(invitado.getId(),cursoActual.getId(),invita.getId());
					if(participanteInvita==null){
						participanteInvita = new Participante();
						persistencia.hacerPersistente(participanteInvita);
						
						participanteInvita.setTipoUsuario(invita);
						participanteInvita.setEstadoParticipante(null);
						participanteInvita.setAula(cursoActual);
						participanteInvita.setPersona(invitado);
					}
				}
				// crear los participantes -----------------------------------------------------------
				
				//Traer todas las comisiones del aula y crearle el tipo de usuario
				Vector comisionesDelAula = controlAula.getComisionesDelAula(cursoActual.getId());
				for (Iterator iterator2 = comisionesDelAula.iterator(); iterator2.hasNext();) {
					Comision comision = (Comision) iterator2.next();
					
					//Participante Coordina
					/*if(true){
						participanteComisionCoordina = getParticipanteComision(coordinador.getId(),comision.getId(),coordina.getId());
						if(participanteComisionCoordina==null){
							participanteComisionCoordina = new ParticipanteComision();
							persistencia.hacerPersistente(participanteComisionCoordina);
							participanteComisionCoordina.setComision(comision);
							participanteComisionCoordina.setFechaAlta(utils.Utils.hoySqlDate());
							participanteComisionCoordina.setParticipante(participanteCoordina);
						}
						
					}*/
					
					//Participante Invita
					if(true){
						participanteComisionInvita = getParticipanteComision(invitado.getId(),comision.getId(),invita.getId());
						if(participanteComisionInvita==null){
							participanteComisionInvita = new ParticipanteComision();
							persistencia.hacerPersistente(participanteComisionInvita);
							
							participanteComisionInvita.setComision(comision);
							participanteComisionInvita.setFechaAlta(utils.Utils.hoySqlDate());
							participanteComisionInvita.setParticipante(participanteInvita);
						}
					}	
										
					//asignarPermisos(comision,coordina);
					asignarPermisos(comision,invita);
				}
				//asignarPermisos(cursoActual,coordina);
				asignarPermisos(cursoActual,invita);
				
			}
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw(e);
		} catch (MyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw(e);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw(e);
		}
  }
  
  
  // Traer los mismos permisos de acceso, segun: Recursos: todos, Aula: ADMINISTRACION RURAL 3301 y 
  // Tipos de usuarios: coordinador y del invitado,
  // y asignarselos a estos tipos de usuarios en las aulas de la facultad AyV
  private static void asignarPermisos(Aula curso, TipoUsuario tipoUsuario)throws Exception{
	  try {
		  
		  Long idAdmRur = new Long("3166749844");//2777405119(siat2Prueba)//3166749844 ORIGINAL
		  if(curso.getId()==idAdmRur)return;
		  //Aula aulaDeLosPermisos = getAulaDelLosPermisos(idAdmRur); 		  
		  
		  Vector permisosAcopiarTipoUsuario = persistencia.getObjectosPorClaseYFiltro
									("persistencia.dominio.PermisoAcceso","aula.id=="+idAdmRur+" & tipoUsuario.id=="+tipoUsuario.getId());
		  PermisoAcceso permisoAccesoCoordina = null; 
		  Vector permisoAux = null;
		  TipoPermiso permisoEscritura = (TipoPermiso)persistencia.getObjectoPorId("persistencia.dominio.TipoPermiso",new Long(131090));
		  
		  for(Iterator iterator = permisosAcopiarTipoUsuario.iterator(); iterator.hasNext();) {
			  PermisoAcceso permisoCopia = (PermisoAcceso) iterator.next();
			  
			  permisoAux = persistencia.getObjectosPorClaseYFiltro("persistencia.dominio.PermisoAcceso","aula.id=="+curso.getId()+
										" & tipoUsuario.id=="+tipoUsuario.getId()+" & recurso.id=="+permisoCopia.getRecurso().getId());
			  
			  if(permisoAux!=null && !permisoAux.isEmpty()){
				 permisoAccesoCoordina = (PermisoAcceso)permisoAux.firstElement();
				 //permisoAccesoCoordina = (PermisoAcceso)persistencia.getObjectoPorId("persistencia.dominio.PermisoAcceso",permisoAccesoCoordina.getId());
				 permisoAccesoCoordina.setTipoPermiso(permisoCopia.getTipoPermiso());
			  }else{
				  //No tenia el permiso, se lo creo
				  PermisoAcceso permisoAccesoPersistente = new PermisoAcceso();
				  persistencia.hacerPersistente(permisoAccesoPersistente);
				  
				  permisoAccesoPersistente.setTipoPermiso(permisoEscritura);
				  permisoAccesoPersistente.setAula(curso);
				  permisoAccesoPersistente.setRecurso(permisoCopia.getRecurso());
				  permisoAccesoPersistente.setTipoUsuario(permisoCopia.getTipoUsuario());		 		  
			  }
		}
		  
	} catch (NumberFormatException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		System.out.println("error NumberFormatException");
		throw(e);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		System.out.println("error Exception");
		throw(e);
	}  
  }
  
  /* -----------------------------------------------------------------------------------------------------------*/
  public static Vector getCursosDeUnaFacultad() throws Exception{
	  try{
		  Long idFacultad = null;
		  String filtro = "aulaCompuesta.id=="+idFacultad;
		  Vector cursosDeLaFacultad = persistencia.getObjectosPorClaseYFiltro("persistencia.dominio.Curso",filtro);
		 
		  return cursosDeLaFacultad;
	  }catch (Exception ex) {
		  ex.printStackTrace();
		  throw ex;
	  }
  }
  
  
  public static boolean commit(){
	  try{
		  persistencia.commit();
		  return true;
	  }catch (Exception ex) {
		  ex.printStackTrace();
		  persistencia.rollback();
		  return false;
	  }
  }


  public static boolean rollback(){
	  try{
		  persistencia.rollback();
		  return true;
	  }catch (Exception ex) {
		  ex.printStackTrace();
		  return false;
	  }
  }
  
}